import sys
import os
sys.path.insert(0, os.path.abspath('../'))
sys.path.insert(0, os.path.abspath('../../'))
import optuna
from qiskit.algorithms import QAOA
from qiskit_optimization.algorithms import MinimumEigenOptimizer
from qiskit_optimization.algorithms import WarmStartQAOAOptimizer, CobylaOptimizer
from shared.graph_helper import *
from shared.QiskitMaxcut import *
from shared.Mitiq_QAOA import *
from ionq.ionq_parameters import *
%matplotlib inline
# ---- Define graph and MaxCut ----
graph = generate_butterfly_graph(with_weights=True)
max_cut = Maxcut(graph)
max_cut_qubo = max_cut.to_qubo()
max_cut.draw()
def init_qaoa(optimizer, reps, init_parameters):
quantum_instance = QuantumInstance(
backend=simulator_backend,
shots=SHOTS,
)
# generate QAOA to get circuit
pre_qaoa = QAOA(optimizer=COBYLA(maxiter=1, tol=0), quantum_instance=quantum_instance, reps=reps, initial_point=init_parameters)
MinimumEigenOptimizer(pre_qaoa).solve(max_cut_qubo)
circuit = pre_qaoa.get_optimal_circuit()
circuit.measure_all()
mitiq_qaoa = Mitiq_QAOA(mitiq_circuit=circuit.copy(),
optimizer=optimizer,
quantum_instance=quantum_instance,
reps=reps,
initial_point=init_parameters)
ws_qaoa = WarmStartQAOAOptimizer(pre_solver=CobylaOptimizer(),
relax_for_pre_solver=True,
qaoa=mitiq_qaoa)
return ws_qaoa
def run(max_cut_problem, qaoa):
# Run quantum algorithm QAOA
result = qaoa.solve(max_cut_problem)
optimal_parameters = qaoa._qaoa.optimal_params
return result, optimal_parameters.copy()
def objective(trial):
optimizer_name = trial.suggest_categorical("optimizer", optimizers.keys())
reps = trial.suggest_int('reps', REPS_MIN, REPS_MAX)
parameters = []
for i in range(reps):
parameters.append(trial.suggest_uniform(f'gamma_{i}', GAMMA_MIN, GAMMA_MAX))
for i in range(reps):
parameters.append(trial.suggest_uniform(f'beta_{i}', BETA_MIN, BETA_MAX))
optimizer = optimizers[optimizer_name]
qaoa = init_qaoa(optimizer, reps, parameters)
result, optimal_parameters = run(max_cut_qubo, qaoa)
mean, distribution = max_cut.analyse(result)
trial.set_user_attr(key="best", value=[mean,result,optimal_parameters])
return mean
study = optuna.create_study(direction='minimize')
study.optimize(objective, n_trials=N_TRIALS, callbacks=[save_best_trial])
[I 2021-07-28 20:10:50,927] A new study created in memory with name: no-name-ca015a96-258e-448a-9fc9-e77af851bb88 [I 2021-07-28 20:12:20,181] Trial 0 finished with value: -27.676000000000013 and parameters: {'optimizer': 'COBYLA', 'reps': 10, 'gamma_0': -0.051975613384926955, 'gamma_1': 2.2372059376743314, 'gamma_2': 0.6338919479443059, 'gamma_3': -2.7964480803975555, 'gamma_4': 0.0765183091595052, 'gamma_5': -2.4650661845400292, 'gamma_6': 0.2047898028516646, 'gamma_7': -1.702214127938663, 'gamma_8': 1.5844493814060128, 'gamma_9': -1.5331751002143403, 'beta_0': 1.769648844346471, 'beta_1': -2.1778746250504186, 'beta_2': 2.598887051507707, 'beta_3': 0.3355790718672256, 'beta_4': 0.5094358571482318, 'beta_5': -1.7406505086514215, 'beta_6': 0.7454932787763293, 'beta_7': -1.6397927336549154, 'beta_8': 1.7204599401987224, 'beta_9': 0.19403815461648533}. Best is trial 0 with value: -27.676000000000013. [I 2021-07-28 20:26:32,512] Trial 1 finished with value: -23.468999999999994 and parameters: {'optimizer': 'SPSA', 'reps': 10, 'gamma_0': -0.510147322855858, 'gamma_1': 2.277680295352674, 'gamma_2': -2.8195140616294414, 'gamma_3': 0.3434988694322141, 'gamma_4': -1.2138972088373277, 'gamma_5': -1.1555900745773469, 'gamma_6': 2.4798217424736455, 'gamma_7': -1.6796395253775873, 'gamma_8': 1.390632284477932, 'gamma_9': -1.9598993026110958, 'beta_0': -2.0099991810759983, 'beta_1': 1.47313109858377, 'beta_2': -2.061213092755274, 'beta_3': -1.4463616867790758, 'beta_4': -2.7124933777806204, 'beta_5': 2.559910623483769, 'beta_6': -1.8519008963011567, 'beta_7': 0.5516564002602697, 'beta_8': 1.9572516365013426, 'beta_9': -0.20957055884746412}. Best is trial 0 with value: -27.676000000000013. [I 2021-07-28 20:40:26,466] Trial 2 finished with value: -27.250999999999994 and parameters: {'optimizer': 'SPSA', 'reps': 8, 'gamma_0': -0.7345991815175772, 'gamma_1': -1.6401226649636196, 'gamma_2': 1.9412504027409945, 'gamma_3': -1.0025538980061692, 'gamma_4': 0.8840593596117046, 'gamma_5': -0.245701081165413, 'gamma_6': 0.9482158868956141, 'gamma_7': -0.7413266739119737, 'beta_0': 0.8205586522265635, 'beta_1': -0.1985964388427468, 'beta_2': 0.8315530974559624, 'beta_3': -0.9521139245187125, 'beta_4': 2.6148745938072535, 'beta_5': 0.4133238796360512, 'beta_6': 1.731835194176841, 'beta_7': 3.0580526650587148}. Best is trial 0 with value: -27.676000000000013. [I 2021-07-28 20:54:08,560] Trial 3 finished with value: -23.887999999999998 and parameters: {'optimizer': 'SPSA', 'reps': 3, 'gamma_0': -2.15882833929222, 'gamma_1': -2.7911664360660913, 'gamma_2': -0.08983061446559004, 'beta_0': -1.684235272274643, 'beta_1': -2.6086760915298286, 'beta_2': 1.9308861374580575}. Best is trial 0 with value: -27.676000000000013. [I 2021-07-28 21:07:41,542] Trial 4 finished with value: -25.681999999999995 and parameters: {'optimizer': 'SPSA', 'reps': 4, 'gamma_0': 0.6652421308338434, 'gamma_1': 2.679815308566165, 'gamma_2': -2.248899661377075, 'gamma_3': 2.6356453504691526, 'beta_0': 0.43787677678930725, 'beta_1': 1.1355941666668512, 'beta_2': 2.8601800128059383, 'beta_3': -1.7064050199607337}. Best is trial 0 with value: -27.676000000000013.
print(study.best_trial)
FrozenTrial(number=0, values=[-27.676000000000013], datetime_start=datetime.datetime(2021, 7, 28, 20, 10, 50, 929068), datetime_complete=datetime.datetime(2021, 7, 28, 20, 12, 20, 178168), params={'optimizer': 'COBYLA', 'reps': 10, 'gamma_0': -0.051975613384926955, 'gamma_1': 2.2372059376743314, 'gamma_2': 0.6338919479443059, 'gamma_3': -2.7964480803975555, 'gamma_4': 0.0765183091595052, 'gamma_5': -2.4650661845400292, 'gamma_6': 0.2047898028516646, 'gamma_7': -1.702214127938663, 'gamma_8': 1.5844493814060128, 'gamma_9': -1.5331751002143403, 'beta_0': 1.769648844346471, 'beta_1': -2.1778746250504186, 'beta_2': 2.598887051507707, 'beta_3': 0.3355790718672256, 'beta_4': 0.5094358571482318, 'beta_5': -1.7406505086514215, 'beta_6': 0.7454932787763293, 'beta_7': -1.6397927336549154, 'beta_8': 1.7204599401987224, 'beta_9': 0.19403815461648533}, distributions={'optimizer': CategoricalDistribution(choices=('SPSA', 'COBYLA')), 'reps': IntUniformDistribution(high=10, low=1, step=1), 'gamma_0': UniformDistribution(high=3.141592653589793, low=-3.141592653589793), 'gamma_1': UniformDistribution(high=3.141592653589793, low=-3.141592653589793), 'gamma_2': UniformDistribution(high=3.141592653589793, low=-3.141592653589793), 'gamma_3': UniformDistribution(high=3.141592653589793, low=-3.141592653589793), 'gamma_4': UniformDistribution(high=3.141592653589793, low=-3.141592653589793), 'gamma_5': UniformDistribution(high=3.141592653589793, low=-3.141592653589793), 'gamma_6': UniformDistribution(high=3.141592653589793, low=-3.141592653589793), 'gamma_7': UniformDistribution(high=3.141592653589793, low=-3.141592653589793), 'gamma_8': UniformDistribution(high=3.141592653589793, low=-3.141592653589793), 'gamma_9': UniformDistribution(high=3.141592653589793, low=-3.141592653589793), 'beta_0': UniformDistribution(high=3.141592653589793, low=-3.141592653589793), 'beta_1': UniformDistribution(high=3.141592653589793, low=-3.141592653589793), 'beta_2': UniformDistribution(high=3.141592653589793, low=-3.141592653589793), 'beta_3': UniformDistribution(high=3.141592653589793, low=-3.141592653589793), 'beta_4': UniformDistribution(high=3.141592653589793, low=-3.141592653589793), 'beta_5': UniformDistribution(high=3.141592653589793, low=-3.141592653589793), 'beta_6': UniformDistribution(high=3.141592653589793, low=-3.141592653589793), 'beta_7': UniformDistribution(high=3.141592653589793, low=-3.141592653589793), 'beta_8': UniformDistribution(high=3.141592653589793, low=-3.141592653589793), 'beta_9': UniformDistribution(high=3.141592653589793, low=-3.141592653589793)}, user_attrs={'best': [-27.676000000000013, optimal function value: -35.0
optimal value: [0. 1. 0. 1. 0.]
status: SUCCESS, array([-0.05197561, 2.23720594, 1.63389195, -2.79644808, 0.07651831,
-2.46506618, 0.2047898 , -1.70221413, 1.58444938, -1.5331751 ,
1.76964884, -2.17787463, 2.59888705, 0.33557907, 0.50943586,
-1.74065051, 0.74549328, -1.63979273, 1.72045994, 0.19403815])]}, system_attrs={}, intermediate_values={}, trial_id=0, state=TrialState.COMPLETE, value=None)
fig = optuna.visualization.plot_optimization_history(study)
fig.show()
mean, result, optimal_params = study.user_attrs["best"]
optimal_params
array([-0.05197561, 2.23720594, 1.63389195, -2.79644808, 0.07651831,
-2.46506618, 0.2047898 , -1.70221413, 1.58444938, -1.5331751 ,
1.76964884, -2.17787463, 2.59888705, 0.33557907, 0.50943586,
-1.74065051, 0.74549328, -1.63979273, 1.72045994, 0.19403815])
max_cut.draw(result)
mean, distribution = max_cut.analyse(result, print_output=True)
plot_histogram(distribution, color='midnightblue', title=f"Expectation Value (Ø: {mean:.3f})")
optimal function value: -35.0 optimal value: [0. 1. 0. 1. 0.] status: SUCCESS Mean: -27.676000000000013 00000: value: 0.000, probability: 0.6% 11111: value: 0.000, probability: 1.1% 10010: value: -13.000, probability: 0.5% 01101: value: -13.000, probability: 1.1% 10000: value: -15.000, probability: 0.1% 01111: value: -15.000, probability: 3.4% 00100: value: -16.000, probability: 2.0% 00010: value: -16.000, probability: 2.4% 11101: value: -16.000, probability: 1.6% 11011: value: -16.000, probability: 3.9% 01100: value: -17.000, probability: 3.8% 10011: value: -17.000, probability: 2.4% 01000: value: -19.000, probability: 2.8% 10111: value: -19.000, probability: 2.5% 10110: value: -29.000, probability: 1.5% 01001: value: -29.000, probability: 0.8% 11110: value: -30.000, probability: 0.3% 00001: value: -30.000, probability: 4.5% 10100: value: -31.000, probability: 4.1% 01011: value: -31.000, probability: 6.2% 11100: value: -32.000, probability: 14.3% 11010: value: -32.000, probability: 1.2% 00110: value: -32.000, probability: 4.0% 11001: value: -32.000, probability: 5.7% 00101: value: -32.000, probability: 3.8% 00011: value: -32.000, probability: 0.1% 01110: value: -33.000, probability: 2.8% 10001: value: -33.000, probability: 1.3% 11000: value: -34.000, probability: 1.7% 00111: value: -34.000, probability: 7.0% 01010: value: -35.000, probability: 0.5% 10101: value: -35.000, probability: 12.0%
import qiskit.tools.jupyter
%qiskit_version_table
| Qiskit Software | Version |
|---|---|
| Qiskit | 0.27.0 |
| Terra | 0.17.4 |
| Aer | 0.8.2 |
| Ignis | 0.6.0 |
| Aqua | 0.9.2 |
| IBM Q Provider | 0.14.0 |
| System information | |
| Python | 3.8.6 (default, Jan 22 2021, 11:41:28) [GCC 8.4.1 20200928 (Red Hat 8.4.1-1)] |
| OS | Linux |
| CPUs | 192 |
| Memory (Gb) | 6046.015735626221 |
| Wed Jul 28 21:07:42 2021 CEST | |
import mitiq
mitiq.about()
Mitiq: A Python toolkit for implementing error mitigation on quantum computers ============================================================================== Authored by: Mitiq team, 2020 & later (https://github.com/unitaryfund/mitiq) Mitiq Version: 0.9.3 Core Dependencies ----------------- Cirq Version: 0.10.0 NumPy Version: 1.20.3 SciPy Version: 1.4.1 Optional Dependencies --------------------- PyQuil Version: Not installed Qiskit Version: 0.27.0 Braket Version: Not installed Python Version: 3.8.6 Platform Info: Linux (x86_64)